//! Yaya libOS 最小化示例应用
//! 
//! 演示如何创建最简化的libOS应用

#![no_std]
#![no_main]

use core::panic::PanicInfo;
use yaya::prelude::*;

/// 程序入口点
#[no_mangle]
pub extern "C" fn _start() -> ! {
    // 初始化最小化运行时
    if let Err(e) = init_minimal_runtime() {
        handle_error(e);
    }
    
    // 执行应用逻辑
    if let Err(e) = run_application() {
        handle_error(e);
    }
    
    // 正常退出
    shutdown_system();
    loop {}
}

/// 初始化最小化运行时
fn init_minimal_runtime() -> Result<(), YayaError> {
    // 初始化基本硬件
    hal::cpu::init()?;
    hal::memory::init()?;
    
    // 初始化基本服务
    services::allocator::init()?;
    
    Ok(())
}

/// 运行应用逻辑
fn run_application() -> Result<(), YayaError> {
    // 简单的应用逻辑
    print_message("Yaya最小化应用启动");
    
    // 演示内存分配
    demo_minimal_memory()?;
    
    print_message("应用执行完成");
    Ok(())
}

/// 演示最小化内存管理
fn demo_minimal_memory() -> Result<(), YayaError> {
    let allocator = get_allocator();
    
    // 分配小块内存
    let addr = allocator.allocate(256, 8)?;
    print_message(&format!("分配内存: {:#x}", addr));
    
    Ok(())
}

/// 打印消息（简化实现）
fn print_message(msg: &str) {
    // 在实际实现中，这里会使用串口或其它输出设备
    // 这里使用简单的内存标记
    unsafe {
        core::ptr::write_volatile(0xb8000 as *mut u8, msg.as_bytes()[0]);
    }
}

/// 错误处理
fn handle_error(error: YayaError) -> ! {
    print_message(&format!("错误: {}", error.description()));
    shutdown_system();
    loop {}
}

/// 关闭系统
fn shutdown_system() {
    print_message("系统关闭");
    // 实际实现中会执行清理操作
}

/// 恐慌处理
#[panic_handler]
fn panic(_info: &PanicInfo) -> ! {
    print_message("发生恐慌");
    shutdown_system();
    loop {}
}